<?php
error_reporting(E_ALL);
date_default_timezone_set("Asia/Shanghai");

define('ROOT', str_replace('\\', '/', __DIR__).'/');
define('TOOL', ROOT.'tool/');
include(TOOL.'Dir.php');
include(TOOL.'Menu.php');

$srcDir = ROOT.'src/'; //源目录 str_replace('\\', '/', $v);
$disDir = ROOT.'dist/'; //编译后文件存放目录


//==============按顺读取src目录中的文件结构
$objDir = Dir::ini($srcDir)
    ->extension('md') //找出md结尾的文件
    ->replace($srcDir, ''); //去掉目录前缀
$fileList = $objDir->fileList;

//==============获取每个文件名的hash值
$objDir->replace('.md', '') //去掉文件后缀
    ->sortFiles() //文件排序
    ->createUniqueCode(); //给每个文件生成一个字符串hash

file_put_contents($disDir.'static/file_chain.js', 'var fileChainList='.json_encode($objDir->fileChainList)); //用于高亮显示

//生成菜单js
$menu = Menu::getMenu($objDir->uniqueList, 'PHP Markdown');
file_put_contents($disDir.'static/menu.js', "var menu = \"{$menu}\";"); //用于

//==============获取上次编译后每个文件的md5值
$fileSignPath = ROOT.'file_sign.php'; //存放了上次编译后每个文件内容的MD5值, 变量名：$fileSignList
if (file_exists($fileSignPath)) {
    include $fileSignPath;
}
$fileSignList = !empty($fileSignList) ? $fileSignList : [];

//==============获取本次编译需要删除的文件
foreach ($fileSignList as $fileName => $hash) {
    $tmp = str_replace('.md', '', $fileName);
    if (empty($objDir->fileHashList[$tmp])) {
        unset($fileSignList[$fileName]);
    }
}

//===============开始编译md文件
foreach ($fileList as $srcFileName) {
    //读取源文件, 并计算内容的md5值, 用于比对内容是否变化
    $text = file_get_contents($srcDir.$srcFileName);
    $sign = md5($text); //也可以用 md5_file(文件名)
    
    // 如果上次没有编译这个文件, 或者内容已改变, 就重新编译
	if ((empty($fileSignList[$srcFileName]) || $fileSignList[$srcFileName] != $sign)) {
        $now = date('Y-m-d H:i:s');
        $text .= PHP_EOL.PHP_EOL."###### 本页面最近修改时间: {$now}";
		
		$pathName = str_replace([$srcDir, '.md'], ['', ''], $srcFileName);

        $hashCode = $objDir->fileHashList[$pathName];
        $disFileName = $disDir.'docs/'. $hashCode. '.md';
        file_put_contents($disFileName, $text);

        echo '编译文件: '.$srcFileName .PHP_EOL;

        $fileSignList[$srcFileName] = $sign; //更新文件md5
	}
}


//==================记录本次编译后，所有文件内容的hash值
file_put_contents($fileSignPath, '<?php '.PHP_EOL. '$fileSignList = '. var_export($fileSignList, true).';');

//==================删除多余的文件
$targetFileHashs = [];
$files = $objDir->getDirFiles($disDir.'docs/');
foreach ($files as $fileName) {
    $hashCode = str_replace('.md', '', $fileName);
    if (!in_array($hashCode, $objDir->fileHashList) && $hashCode != 'index') {
        $file = $disDir.'docs/'.$hashCode.'.md';
        unlink($file);
        echo '删除文件：'.$file.PHP_EOL;
    }
}

echo '结束.';
